package org.posupe.pessoas;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.posupe.bdr.PersistenceMechanismException;
import org.posupe.bdr.PersistenceMechanismRDBMS;
import org.posupe.util.RepositorioException;

/**
 * @author Marcio Calado
 */
public class RepositorioPessoasJuridicasBDR{

	private static RepositorioPessoasJuridicasBDR instance;
	private PersistenceMechanismRDBMS pm;


	private static String SQL_INSERT = "INSERT INTO PESSOA_JURIDICA (CODIGO,FAX,TELEFONE,NOME_FANTASIA) VALUES (?,?,?,?)";
	private static String SQL_REMOVE = "DELETE FROM PESSOA_JURIDICA WHERE CODIGO = ?";
	private static String SQL_UPDATE = "UPDATE PESSOA_JURIDICA SET FAX = ?,TELEFONE = ?, NOME_FANTASIA = ? WHERE CODIGO = ? ";
	private static String SQL_SELECT_WHERE = "SELECT CODIGO,FAX,TELEFONE,NOME_FANTASIA FROM PESSOA_JURIDICA WHERE CODIGO = ? ";

	private RepositorioPessoasJuridicasBDR() throws RepositorioException {
		try {
			pm = PersistenceMechanismRDBMS.getInstance();
			pm.connect();
		}
		catch (Exception ex) {
			throw new RepositorioException(ex);
		}
	}

	public synchronized static RepositorioPessoasJuridicasBDR getInstance() throws RepositorioException {
		if (instance == null) {
			instance = new RepositorioPessoasJuridicasBDR();

		}
		return instance;
	}

	public void inserir(PessoaJuridica pessoa) throws RepositorioException {
		PreparedStatement statement = getStatement(SQL_INSERT);
		try {
			try{
			RepositorioPessoasBDR.getInstance().inserir(pessoa);
			statement.setString(1, pessoa.getCodigo());
			statement.setString(2, pessoa.getFax());
			statement.setString(3, pessoa.getTelefone());
			statement.setString(4, pessoa.getNomeFantasia());
			statement.executeUpdate();
			}finally{
				statement.close();
			}
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} 
	}

	public void remover(String codigo) throws RepositorioException, PessoaJuridicaInexistenteException {
		try{
			PreparedStatement statement = getStatement(SQL_REMOVE);
			try{
				statement.setString(1, codigo);
				int i = statement.executeUpdate();
				if (i == 0) {
					throw new PessoaJuridicaInexistenteException(codigo);
				}
				RepositorioPessoasBDR.getInstance().remover(codigo);
			}finally{
				statement.close();
			}
		} catch(SQLException e){
			throw new RepositorioException(e);            
		} catch (PessoaInexistenteException e) {
			throw new PessoaJuridicaInexistenteException(codigo);
		}
	}

	public PessoaJuridica procurar(PessoaJuridica pessoa) throws PessoaJuridicaInexistenteException, RepositorioException {
		PreparedStatement statement = getStatement(SQL_SELECT_WHERE);
		ResultSet resultset = null;
		try {
			try{
				RepositorioPessoasBDR.getInstance().procurar(pessoa);
				statement.setString(1, pessoa.getCodigo());
				resultset = statement.executeQuery();
				if (resultset.next()) {
					pessoa.setFax(resultset.getString("FAX"));
					pessoa.setNomeFantasia(resultset.getString("NOME_FANTASIA"));
					pessoa.setTelefone(resultset.getString("TELEFONE"));
				} else {
					throw new PessoaJuridicaInexistenteException(pessoa.getCodigo());
				}
			}finally{
				resultset.close();
				statement.close();
			}
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} catch (PessoaInexistenteException e) {
			throw new PessoaJuridicaInexistenteException(pessoa.getCodigo());
		} 
		return pessoa;
	}

	public void atualizar(PessoaJuridica pessoa) throws PessoaJuridicaInexistenteException, RepositorioException {
		PreparedStatement statement = getStatement(SQL_UPDATE);

		try{
			try{
				RepositorioPessoasBDR.getInstance().atualizar(pessoa);
				statement.setString(1, pessoa.getFax());			
				statement.setString(2, pessoa.getTelefone());
				statement.setString(4, pessoa.getCodigo());
				statement.setString(3, pessoa.getNomeFantasia());
				statement.executeUpdate();
			}finally {
				statement.close();
			}
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} catch (PessoaInexistenteException e) {
			throw new PessoaJuridicaInexistenteException(pessoa.getCodigo());
		} 
	}

	public boolean existe(String codigo) throws RepositorioException {
		boolean resposta = false;
		PreparedStatement statement = getStatement(SQL_SELECT_WHERE);
		ResultSet resultset = null;
		try {
			try{
				statement.setString(1, codigo);
				resultset = statement.executeQuery();
				resposta = resultset.next();
			}finally{
				resultset.close();
				statement.close();	
			}
		} catch (SQLException e) {
			throw new RepositorioException(e);
		} 
		return resposta;
	}
	
	private PreparedStatement getStatement(String statement) throws RepositorioException {
		try {
			return (PreparedStatement) this.pm.getCommunicationChannel(statement);
		} catch (PersistenceMechanismException e) {
			throw new RepositorioException(e);
		}
	}

}